#pragma once
#include<string>
#include"noncopyable.h"



//定义四种宏以方便用户使用 LOG("%s %d",arg1,arg2)
#define LOG_INFO(logmsgformat, ...)\
    do\
    {\
        Logger& logger = Logger::GetInstance();\
        logger.setLogLevel(INFO);\
        char buf[1024]={0};\
        snprintf(buf,1024,logmsgformat,##__VA_ARGS__);\
        logger.log(buf);\
    }while(0)

#define LOG_ERROR(logmsgformat, ...)\
    do\
    {\
        Logger& logger = Logger::GetInstance();\
        logger.setLogLevel(ERROR);\
        char buf[1024]={0};\
        snprintf(buf,1024,logmsgformat,##__VA_ARGS__);\
        logger.log(buf);\
    }while(0)
    
#define LOG_FATAL(logmsgformat, ...)\
    do\
    {\
        Logger& logger = Logger::GetInstance();\
        logger.setLogLevel(FATAL);\
        char buf[1024]={0};\
        snprintf(buf,1024,logmsgformat,##__VA_ARGS__);\
        logger.log(buf);\
        exit(-1);\
    }while(0)

#ifdef MUDEBUG
#define LOG_DEBUG(logmsgformat, ...)\
    do\
    {\
        Logger& logger = Logger::GetInstance();\
        logger.setLogLevel(IDEBUG);\
        char buf[1024]={0};\
        snprintf(buf,1024,logmsgformat,##__VA_ARGS__);\
        logger.log(buf);\
    }while(0)
#else
    #define LOG_DEBUG(logmsgformat, ...)
#endif



enum LogLevel
{
    INFO=0,//正常信息
    ERROR,//错误信息但不致命
    FATAL,//致命信息
    DEBUG,//调试信息，通常在开发和测试阶段使用，生产环境中可能会关闭以减少日志量。
    //WARNING;//某个操作失败但有备用方案，或者资源使用接近上限。
};

class Logger:noncopyable
{
    public:
        static Logger& GetInstance();

        //设置日志级别
        void setLogLevel(int level);

        //写日志
        void log(const std::string msg);
        
    private:
        int LogLevel_;
};